#include <stdio.h>
#include <string.h>
#include <openssl/md5.h>
#include <openssl/sha.h>

static void get_cpuid(unsigned char *cpuid)
{
	unsigned long s1,s2,s3,s4;
	char string[128];
	char p1[128], p2[128];
	unsigned int eax = 0;
	unsigned int ebx,ecx,edx;

#if 0
	asm volatile
		(   "cpuid"
			: "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)
			: "0"(0) 
		);
	snprintf(cpuid, 5, "%s", (char *)&ebx);
	snprintf(cpuid+4, 5, "%s", (char *)&edx);
	snprintf(cpuid+8, 5, "%s", (char *)&ecx);
#endif

	asm volatile  
		(   "movl $0x01 , %%eax ; \n\t"
			"xorl %%edx , %%edx ;\n\t"
			"cpuid ;\n\t"
			"movl %%edx ,%0 ;\n\t"
			"movl %%eax ,%1 ; \n\t"
			:"=m"(s1),"=m"(s2)
		); 

	sprintf((char *)p1, "%08X-%08X-", s1, s2);
	snprintf(cpuid, 19, "%s", (char *)p1);

	asm volatile
		(   "movl $0x03,%%eax ;\n\t"
			"xorl %%ecx,%%ecx ;\n\t"
			"xorl %%edx,%%edx ;\n\t"
			"cpuid ;\n\t"
			"movl %%edx,%0 ;\n\t"
			"movl %%ecx,%1 ;\n\t"
			:"=m"(s3),"=m"(s4)
		);

	sprintf((char *)p2, "%08X-%08X", s3, s4);
	snprintf(cpuid+18, 19, "%s", (char *)p2);

}


int main(int argc, char *argv[])
{
	unsigned char buf[64];

	get_cpuid(buf);

	printf("%s\n", (char*)buf);

	return 0;
}

